home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1996 April
/
CHIP 1996 aprilis (CD06).zip
/
CHIP_CD06.ISO
/
hypertxt.arj
/
92
/
MEGO9209.CD
< prev
next >
Wrap
Text File
|
1995-09-09
|
7KB
|
197 lines
@VJól megkevertük a kijelzést...@N
Júniusi számunk rejtvényeirôl van szó. Utólag
azonosíthatatlan ördögök jóvoltából lemaradt a digitális
kijelzôrôl szóló feladat ábrája, s természetesen megfejtôink
mindegyike más elrendezést tartott szokásosnak, így nemcsak
a kártyák, de a bitek is megkeveredtek. Mea culpa...
@VKeverés@N
Lássuk elôször a keverés-osztás problémáját.
Emlékeztetôül: a megoldandó feladat egy bridzs-leosztást
kiíró program beküldése volt. Az 52 lapos francia kártyát 4
játékos között kellett egyenlôen szétosztani -- lehetôleg
gyorsan. Nem akármirôl van szó: a lehetséges
bridzs-leosztások száma egészen pontosan
53644737765488792839237440000.
Megoldóink többsége két alapvetô eljárás közül
választott, öten kétféleképpen is kidolgozták a feladatot.
Tizenegyen küldtek be jó megoldást -- Pascal, C, és
Modula--2 nyelven.
Voltak akik ""kártyaszerûen" gondolkodtak, az 52 lapot
(vagyis a nekik megfelelô számokat, jeleket) elôször
megkeverték, majd az így elôállított véletlen (kevert)
halmaz elemeit sorban kiosztották a játékosok között. Hogyan
lehet keverni? Itt is két út kínálkozik:
a/ vegyünk a pakliból 2 véletlen lapot (helyüket
megjegyezve), ezeket cseréljük fel, s ezt az eljárást
ismételjük valahányszor (ki fix értékkel dolgozott, ki a
futtatóra bízta a döntést).
b/ tegyük fel, hogy az elsô k-1 helyen már megkevert
kártyák vannak. Vegyük ki a k. lapot, s ezt cseréljük fel a
maradék 52-k lap közül véletlenül kiválasztott lappal.
Az eljárás értelemszerûen a paklin való
""végiggyaloglással" ér véget.
A másik fô megoldási lehetôség kártyával kissé
nehezebben realizálható: tudniillik nem keverünk, hanem a
pakliból véletlenszerûen választva rögtön lapot adunk az
egyes játékosoknak. (Megjegyzendô, hogy ez szintén keverés,
csak éppen nem egy tömbön belül, hanem két tömböt használva
dolgozunk.) Kérdés, mit csináljunk a kihúzott lapok
""helyével"? Ha üresen hagyjuk ezeket, akkor az osztás
végefelé érzékelhetôen lelassul a programunk, hiszen ha üres
helyre ""bök" a véletlenszám-generátorunk, akkor
sorsolhatunk újra, s mondjuk 45 üres hely esetén ez már elég
sok helybenjárást jelent. Csináljuk azt, ami a kártyával
spontán megtörténik: az üres helyekre a pakli ""benyomul".
îgy egyre kisebb, szorosan feltöltött tömbbôl kell
sorsolnunk, egészen addig, míg egyetlen elem marad.
A közölt megoldás (1. lista -- Horváth Sándor munkája)
ez utóbbi utat járja be, elegáns módon -- a francia kártya
jelöléseivel -- kiíratva a kikevert leosztást.
A júniusi nyertes pedig (egy doboz Tungsram floppy
tulajdonosa) -- keverés, húzás után -- Varga József lett.
@VKijelzés@N
A feladat az alábbi volt (most már az ígért ábrával --
jobb késôn, mint soha): a számológépek többsége a decimális
számjegyeket egy hét vonalat tartalmazó keret segítségével
jelzi ki.
îrjunk egy olyan programot, amely egy 16 bites pozitív
egészhez (például a Pascal @Kword@N típusa), megadja a kijelzési
módját, azaz öt hétjegyû bináris számot, melyek egyes bitjei
pontosan akkor 1 értékûek, ha a megfelelô vonal szerepel a
kijelzésben. Más elrendezés használata (s a 13 megoldó
szinte kivétel nélkül ""egyedi" kijelzôt tervezett), a
megoldás értékét természetesen nem befolyásolta.
A megfejtôk két részletben oldották meg a feladatot.
Elôször -- általában ""kézimunkával" -- elkészítették az
egyes számjegyek ""képét", azaz a nekik megfelelô
bitkiosztást. Valószínûleg ezt a részt nem is érdemes
algoritmizálni, hiszen pillanatok alatt megalkotható a tíz
számjegynek megfelelô bitsorozat, melyeket aztán konstans
tömbként tárolhatunk a programban. Ezt kell hogy kövesse a
kijelzendô szám jegyekre szeletelése. Az egyes megoldások
különbözôségét -- az elrendezésen túl -- elsôsorban a
""szolgáltatások" mennyisége okozta. Bitsorozat kontra
kijelzés, kezdô szóközök, nullák kiíratása stb. És
természetesen volt nyúlfarknyi hibátlan, s több oldalas
hibásan mûködô (egyjegyû számokat nem ismerô) lista is.
A mintaként közölt megoldás (2. lista -- Dudás József
programja) viszonylagos hosszúságának oka, hogy a kitûzött
feladaton (bitsorozat megadása) túlmenôen látványos
kijelzést valósít meg.
A helyes megoldást beküldôk a decemberi sorsoláson
vesznek részt.
@KBánhegyesi Zoltán@N
program kever;
{Horváth Sándor}
uses crt;
const
szin: array[0..3] of char = (#3,#4,#5,#6);
szam: array[0..12] of string[2]=
('2','3','4','5','6','7','8','9','10',
'J','Q','K','A');
var pakli: array[0..51] of byte;
i,lap: byte;
begin
clrscr;
randomize;
for i:=0 to 51 do pakli[i]:=i;
for i:=0 to 3 do write(chr(49+i),'. jatekos ');
for i:=51 downto 0 do begin
lap:=random(i+1);
gotoxy(((51-i) mod 4) * 11 +4,
((51-i) div 4) +3);
write(szin[pakli[lap] div 13] + ' '
+ szam[pakli[lap] mod 13]);
pakli[lap]:=pakli[i];
end;
repeat until keypressed;
end.
program dec_kijelzo(input,output);
{Dudás János}
uses crt;
const
dec_szamjegy:array[0..9] of byte=
(64+32+16+8+4+1,
64+16,
32+16+4+2+1,
{ dec_szamjegy[i.] eleme } 64+16+4+2+1,
{ az i szam bináris 7 bites } 64+16+8+2,
{ képe a keret számozásnak } 64+8+4+2+1,
{ megfelelöen } 64+32+8+4+2+1,
64+16+4,
64+32+16+8+4+2+1,
64+16+8+4+2+1);
f=#219;
v=f+f+f+f+f+f+f;
keret:array[0..6,1..2] of byte=
((0,8),(0,4),(0,0),(0,0),(6,0),(0,5),(6,5));
{ A megjelenítéshez a 0..6 vonalak eltolásai }
var szam:word; { Az input }
i,j:byte;
kszam:array[1..5] of byte;
{ A szam decimális számjegyei a vonalak
számozásának megfelelöen, binárisan }
function hatvany(alap,kitevo:byte):longint;
begin
hatvany:=round(exp(ln(alap)*kitevo));
end;
procedure bit_ki(x,y,j:byte);
begin
if j>2 then
begin
gotoxy(x,y);write(f);
gotoxy(x,y+1);write(f);
gotoxy(x,y+2);write(f);
gotoxy(x,y+3);write(f);
end
else
begin
gotoxy(x,y);write(v);
end;
end;
procedure kijelzes(x,y:byte);
var bin_jegy:byte;
begin
for i:=1 to 5 do
for j:=0 to 6 do
begin
bin_jegy:=(kszam[i] mod hatvany(2,j+1))
div hatvany(2,j);
if bin_jegy=1 then
bit_ki(x+9*(5-i)+keret[j,1],y+keret[j,2],j);
end;
end;
begin
clrscr;
write('A kijelezni kivant szam (0<=x<=65535): ');
readln(szam);
for i:=1 to 5 do
begin
kszam[i]:=dec_szamjegy[(szam mod hatvany(10,i))
div hatvany(10,i-1)];
end;
kijelzes(18,8);
readln;
end.